home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / DEMOS / CHESS / ANIMATE.C next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  2.6 KB  |  132 lines

  1. /*
  2.  * animate.c - part of the chess demo in the glut distribution.
  3.  *
  4.  * (C) Henk Kok (kok@wins.uva.nl)
  5.  *
  6.  * This file can be freely copied, changed, redistributed, etc. as long as
  7.  * this copyright notice stays intact.
  8.  */
  9.  
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <GL/glut.h>
  13. #include "chess.h"
  14.  
  15. #define MOVE_FRAC 8
  16.  
  17. int frac;
  18. int stage;
  19. int piece;
  20. int piece2;
  21. int X, Y, NX, NY, XD, YD;
  22. GLfloat CX1, CY1;
  23. GLfloat CX2, CY2, CZ2;
  24.  
  25. FILE *inpf = NULL;
  26.  
  27. extern int path[10][10];
  28. extern int board[10][10];
  29. extern int cycle[10][10], cyclem, cycle2;
  30. extern int stunt[10][10], stuntm, stunt2;
  31.  
  32. void read_move(void)
  33. {
  34.     char buf[256];
  35.  
  36.     if (!inpf)
  37.     inpf = fopen("chess.inp", "r");
  38.  
  39.     if (!inpf)
  40.     {
  41.     fprintf(stderr, "Could not open file chess.inp for reading.\n");
  42.     exit(1);
  43.     }
  44.  
  45.     if (feof(inpf))
  46.     return;
  47.  
  48.     fgets(buf, 200, inpf);
  49.  
  50.     CX1 = NX = X = buf[0]-'a'+1;
  51.     CY1 = NY = Y = buf[1]-'0';
  52.     CX2 = XD = buf[2]-'a'+1;
  53.     CY2 = YD = buf[3]-'0';
  54.  
  55.     piece = board[X][Y];
  56.     piece2 = board[XD][YD];
  57.     board[X][Y] = 0;
  58.     board[XD][YD] = 0;
  59.     solve_path(X, Y, XD, YD);
  60.     stage = 0;
  61.     frac = 0;
  62.     cyclem = cycle[X][Y];
  63.     cycle2 = cycle[XD][YD];
  64.     stuntm = stunt[X][Y];
  65.     stunt2 = stunt[XD][YD];
  66.     switch(path[X][Y])
  67.     {
  68.         case NORTH:    NY--; break;
  69.         case SOUTH:    NY++; break;
  70.         case WEST:    NX--; break;
  71.         case EAST:    NX++; break;
  72.         case NORTHWEST:    NX--; NY--; break;
  73.         case NORTHEAST:    NX++; NY--; break;
  74.         case SOUTHWEST:    NX--; NY++; break;
  75.         case SOUTHEAST:    NX++; NY++; break;
  76.     }
  77.     if (NY == YD && NX == XD)
  78.     stage = 1;
  79. }
  80.  
  81. void proceed(void)
  82. {
  83.     frac ++;
  84.     if (stage == 1)
  85.     {
  86.     if (piece2 && frac <= MOVE_FRAC * 2)
  87.     {
  88.         CZ2 = -((GLfloat) frac)/MOVE_FRAC/1.8;
  89.         return;
  90.     }
  91.     frac = 0;
  92.     piece2 = 0;
  93.     stage ++;
  94.     return;
  95.     }
  96.     else if (stage == 3)
  97.     return;
  98.     else
  99.     CZ2 = 0.0;
  100.  
  101.     if (frac >= MOVE_FRAC)
  102.     {
  103.     frac = 0;
  104.     X = NX;
  105.     Y = NY;
  106.     if (NX == XD && NY == YD)
  107.     {
  108.         board[XD][YD] = piece;
  109.         cycle[XD][YD] = cyclem;
  110.         stunt[XD][YD] = stuntm;
  111.         piece = 0;
  112.         read_move();
  113.         return;
  114.     }
  115.         switch(path[X][Y])
  116.         {
  117.             case NORTH:        NY--; break;
  118.             case SOUTH:        NY++; break;
  119.             case WEST:        NX--; break;
  120.             case EAST:        NX++; break;
  121.             case NORTHWEST:    NX--; NY--; break;
  122.             case NORTHEAST:    NX++; NY--; break;
  123.             case SOUTHWEST:    NX--; NY++; break;
  124.             case SOUTHEAST:    NX++; NY++; break;
  125.         }
  126.     if (NX == XD && NY == YD)
  127.         stage ++;
  128.     }
  129.     CX1 = ((GLfloat) (X*(MOVE_FRAC-frac) + NX*frac))/ MOVE_FRAC;
  130.     CY1 = ((GLfloat) (Y*(MOVE_FRAC-frac) + NY*frac))/ MOVE_FRAC;
  131. }
  132.